import axios from "axios";
import Msg from '~/utils/msg';

import { sm4 } from 'sm-crypto';

// SM4 密钥（16字节）
const SM4_KEY = '1234567890abcdef1234567890abcdef' // 替换为你的密钥

// 加密函数
function sm4Encrypt(data) {
    return sm4.encrypt(data, SM4_KEY);
}

// 解密函数
function sm4Decrypt(encryptedData) {
    return sm4.decrypt(encryptedData, SM4_KEY);
}

// 自定义 JSON 解析器，处理大数字
function parseJSONWithBigInt(jsonString) {
    return JSON.parse(jsonString, (key, value) => {
        // 检查是否是可能会溢出的大整数
        if (typeof value === 'string' && /^\d+$/.test(value)) {
            // 如果是纯数字字符串，且长度超过安全整数位数，保持字符串形式
            if (value.length > 15) {
                return value;
            }
            // 否则转为数字
            return Number(value);
        }
        return value;
    });
}

const service = axios.create({
    //基础URL
    baseURL: import.meta.env.VITE_API_BASE_PREFIX,
    //请求超时30秒
    timeout: 30000
    // headers: {
    //     'Content-Type': 'application/json' // 默认 Content-Type 设置为 application/json
    // }
})
//请求拦截器
service.interceptors.request.use(function (config) {
    // 检查是否为文件上传请求
    if (config.headers['Content-Type'] && config.headers['Content-Type'].includes('multipart/form-data')) {
        // 如果是文件上传请求，直接返回 config 不进行加密
        return config;
    }
    if (config.url.includes("myDruid/doLogin")) {
        return config;
    }

    // 对其他请求进行加密处理
    if (config.data && Object.keys(config.data).length > 0) {
        config.data = { data: sm4Encrypt(JSON.stringify(config.data)) };
    }
    return config;
}, function (err) {
    // 请求错误
    return Promise.reject(err);
});

//响应拦截器
service.interceptors.response.use(function (response) {
    //对响应数据做点什么
    if (response.config.url.includes('api-docs') || response.config.url.endsWith('.json')) {
        return response.data;
    }
    if (response.config.responseType === 'blob') {
        return response;
    }
    if (response.data !== null && response.data !== undefined && response.data !== '') {
        // 使用自定义解析器解析解密后的数据
        const decryptedData = JSON.parse(sm4Decrypt(response.data));
        if (decryptedData.code === 200) {
            // 判断decryptedData.data是否为空，为空则返回decryptedData，否则返回decryptedData.data
            return decryptedData.data !== null && decryptedData.data !== undefined
                ? decryptedData.data : decryptedData;
        } else {
            Msg.error(decryptedData.message);
            return Promise.reject(decryptedData);
        }
    }
    return response.data;
}, function (res) {
    //响应错误
    try {
        if (res.response && res.response.data) {
            try {
                // 错误响应也使用自定义解析器
                const data = parseJSONWithBigInt(sm4Decrypt(res.response.data));
                // 显示错误消息
                if (data.message) {
                    Msg.error(data.message);
                } else if (data && data.code === 500) {
                    Msg.error('系统异常,请稍后再试');
                } else {
                    Msg.error('请求失败');
                }
                // 返回解密后的数据而不是原始res
                return Promise.reject(data);
            } catch (decryptError) {
                // 尝试直接解析响应数据（可能是未加密的错误响应）
                try {
                    const plainData = typeof res.response.data === 'string' ? JSON.parse(res.response.data) : res.response.data;
                    if (plainData && plainData.code === 500) {
                        Msg.error(plainData.message || '系统异常,请稍后再试');
                        return Promise.reject(plainData);
                    }
                } catch (parseError) {
                    console.error('解析错误响应数据失败:', parseError);
                }
                console.error('解密响应错误数据失败:', decryptError);
                Msg.error('请求失败');
            }
        } else {
            Msg.error('请求失败');
        }
    } catch (error) {
        console.error('处理响应错误失败:', error);
        Msg.error('请求失败');
    }
    return Promise.reject(res);
});

export default service